# -*- coding:utf-8 -*-
# 北梦测教育
# 课程咨询加微信：xiaobeiceshi
from collections import defaultdict
from operator import itemgetter
from utils.http_requester import HttpRequester


# 用来实现数据库单例模式的装饰器
def singleton(cls):
    """
    单例模式的装饰器
    :param cls: 需要实现单例模式的类
    :return:
    """
    instance = {}

    def get_instance(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]

    return get_instance


# 分组排序的装饰器
def group_sort_decorator(func):
    """
    实现对测试用例进行分组排序的装饰器
    :param func: read_excel函数
    :return:
    """

    def wrapper():

        data = func()
        grouped_data = defaultdict(list)

        # 遍历了excel读取出来的原始数据，然后进行了分组
        for story in data:
            grouped_data[story['story']].append(story)

        # 按照order值对场景内的接口顺序进行排序
        sorted_grouped_data = {story: sorted(item, key=itemgetter("order")) for story, item in grouped_data.items()}

        # print(sorted_grouped_data)

        # 把数据结构还原为原始的read_excel函数返回的数据结构
        res_data = []
        for value in sorted_grouped_data.values():
            res_data.extend(value)

        return res_data

    return wrapper


# 通过装饰器来简化调用方式
# send_request的装饰器
def http_request_wrapper(func):
    def wrapper(*args, **kwargs):
        data = func(*args, **kwargs)
        return HttpRequester().send_request(**data)

    return wrapper
